﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using MDK;
using MDK.Physics;
using ZedGraph;



/*
 * Вигнер - с большой буквы
 * ширина резонанса
 * заряженные продукты распада
 * место рождения невидимой частицы
 * 
 * Моделирование распределения энергий гамма-квантов после распада нейтрального пиона.
 * 
 * переименовать в "анигиляция протон-антипротон"
 * 
 * рассеяние альфа частиц атомами
 * 
 * Рассеяние частиц на частицах, одинакового по знаку заряду.
 * Модель кулоновского рассеяния одних частиц на других
 * 
 * 
 * Зондирование протона.
 * Зондирование протона частицами с различной длиной волны, с целью изучения внутреней структуры протона.
 * электронами с различн. длиной волны
 * 
 * 
 * плакат
 * корсплатформность
 * 
 * _демонстрационное_ моделирование
 * 
 * 
 * */
namespace micro10
{
    public class SomePhysicsClass : GraphicPrimitive
    {
        #region Конструкторы
        public SomePhysicsClass()
            : base(0, 0, new Size())
        {
            this.Needs = ExperimentNeeds.Graph;
            AddParametersToTemplate();
        }

        public SomePhysicsClass(int Left, int Top, Size Size)
            : base(Left, Top, Size)
        {
            this.Needs = ExperimentNeeds.Graph;

            // передаём размеры
            this.Left = Left;
            this.Top = Top;

            this.Size = Size;

            //создаём список по умолчанию
            AddParametersToTemplate();
        }

        public override ExperimentAbout GetAbout()
        {
            return new ExperimentAbout("CollapseGraph",
                                        "Исследование различных величин при распаде a -> 1+2",
                                        "");
        }

        #endregion

        #region Методы взаимодействия с главным модулем
        private void AddParametersToTemplate()
        {
            ParameterListTemplate = new ParameterList();

            // TODO: добавляйте ваши параметры тут.
            ParameterListTemplate.Add("Начальная энергия", "Ea", 100);
            ParameterListTemplate.Add("Начальный импульс", "Pa", 50);
            ParameterListTemplate.Add("Начальная скорость", "Va", 50);

            /*
            ParameterListTemplate.Add("Масса первой частицы", "m1", 20);
            ParameterListTemplate.Add("Масса второй частицы", "m2", 30);*/
        }

        public override void SetParameters(ParameterList pList)
        {
            // todo: получить параметры из pList во "внутренние" переменные 
            a.E = pList["Ea"];
            a.p = pList["Pa"];
            a.V = pList["Va"];

            a.Mass = Math.Sqrt(a.E * a.E - a.p * a.p);
        }

        public override void SetGraphInfo(GraphPane pane)
        {
            pane.Title.Text = "teta2; teta1 = max";

            pane.XAxis.Title.Text = "m1";
            pane.YAxis.Title.Text = "teta2";
        }


        public override ParameterList GetParameters()
        {
            ParameterList RetList = ParameterListTemplate;
            

            return RetList;
        }
        #endregion

        Particle a = new Particle();
        
        public override PointPairList GetPoints()
        {
            PointPairList points = new PointPairList();

            double N = 0;
            for (double psi = 0; psi < 3.14; psi += 0.01)
            {
                N = a.m * Math.Sqrt(1 - a.V * a.V) * Math.Cos(psi / 2);
                N /= 2 * a.p * Math.Sin(psi / 2) * Math.Sin(psi / 2) * Math.Pow((Math.Sin(psi / 2) * Math.Sin(psi / 2) - (a.m / a.E) * (a.m / a.E)),2);
                points.Add(psi, N);
            }
            

            return points;
        }
    }
}
